package net.blank.ui.core
{
	import flash.events.Event;
	
	/**
	 * 派生自 AbstractRenderOptUI 对象,被渲染完成时派发
	 */
	[Event(name="render_complete", type="ui.core.RenderEvent")]
	
	/**
	 * 对显示对象进行渲染优化
	 * @author blank
	 * 
	 */
	public class AbstractRenderOptUI extends AbstractUI
	{
		/**
		 * 是否需要更新
		 */
		private var isNeedUpdate:Boolean;
		
		/**
		 * 为子类提供一个不进行渲染延迟而设置属性的命名空间,一般用于渲染时
		 */
		protected namespace noRenderDelay;
		
		/**
		 * 更新
		 * 
		 */
		protected function update():void{}
		
		/**
		 * 图像渲染
		 * @param evt
		 * 
		 */
		private function renderHandler(evt:Event):void{
			removeEventListener(Event.ENTER_FRAME,renderHandler);/*可能需要在 update() 中添加下一次的更新内容,所以此语句应该放在前面*/
			isNeedUpdate=false;/*可能需要在 update() 中添加下一次的更新内容,所以此语句应该放在前面*/
			
			update();
			
			if(hasEventListener(RenderEvent.RENDER_COMPLETE)){
				dispatchEvent(new RenderEvent(RenderEvent.RENDER_COMPLETE));
			}
		}
		
		/**
		 * 使下在渲染周期执行 update() 方法.
		 * 
		 */
		protected function invalidate():void{
			if(!isNeedUpdate){
				if(visible && stage){
					addEventListener(Event.ENTER_FRAME,renderHandler);
				}
				isNeedUpdate=true;
			}
		}
		
		/**
		 * 被添加进舞台
		 * @param evt
		 * 
		 */
		private function addToStageHandler(evt:Event):void{
			if(isNeedUpdate && visible){
				addEventListener(Event.ENTER_FRAME,renderHandler);
			}
		}
		
		/**
		 * 被从舞台移除
		 * @param evt
		 * 
		 */
		private function removeFromStageHandler(evt:Event):void{
			removeEventListener(Event.ENTER_FRAME,renderHandler);
		}
		
		/**
		 * 对显示对象进行渲染优化
		 * 
		 */
		public function AbstractRenderOptUI(){
			super();
			
			addEventListener(Event.ADDED_TO_STAGE,addToStageHandler);
			addEventListener(Event.REMOVED_FROM_STAGE,removeFromStageHandler);
		}
		
		/**
		 * 内容的宽度
		 * @param value
		 * 
		 */
		public function set contentWidth(value:Number):void{
			super.width=value;
		}
		public function get contentWidth():Number{
			return super.width;
		}
		
		/**
		 * 内容的高度
		 * @param value
		 * 
		 */
		public function set contentHeight(value:Number):void{
			super.height=value;
		}
		public function get contentHeight():Number{
			return super.height;
		}
		
		/**
		 * 是否正在等待渲染更新
		 * @return 
		 * 
		 */
		public function get isWaitingRender():Boolean{
			return isNeedUpdate;
		}
		
		/**
		 * 宽
		 * @param value
		 * 
		 */
		override public function set width(value:Number):void{}
		override public function get width():Number{
			return 0;
		}
		
		/**
		 * 高
		 * @param value
		 * 
		 */
		override public function set height(value:Number):void{}
		override public function get height():Number{
			return 0;
		}
		
		override public function set visible(value:Boolean):void{
			super.visible=value;
			if(value){
				if(isNeedUpdate && stage){
					addEventListener(Event.ENTER_FRAME,renderHandler);
				}
			}else{
				removeEventListener(Event.ENTER_FRAME,renderHandler);
			}
		}
		
		override public function destroy():void{
			removeEventListener(Event.ENTER_FRAME,renderHandler);
			removeEventListener(Event.ADDED_TO_STAGE,addToStageHandler);
			removeEventListener(Event.REMOVED_FROM_STAGE,removeFromStageHandler);
			
			super.destroy();
		}
		
		override public function reset():void{
			isNeedUpdate=false;
			if(hasEventListener(Event.ENTER_FRAME)){
				removeEventListener(Event.ENTER_FRAME,renderHandler);
			}
		}
	}
}